class ImageAspectRatio:

    LANDSCAPE = {"landscape": 1}
    PORTRAIT = {"portrait": 2}
    STANDARD = {"standard": 3}


class ImageSize:

    SMALL = {"small": 1}
    MEDIUM = {"medium": 2}
    LARGE = {"large": 3}
    XLARGE = {"xlarge": 4}
    AMAZING = {"amazing": 5}
    FANTASTIC = {"fantastic": 6}
    INCREDIBLE = {"incredible": 7}
    UNCANNY = {"uncanny": 8}


class Image:

    def __init__(self, path, extension):
        self.__path, self.__extension = path, extension

    def extension(self):
        return self.__extension

    def detailed(self):
        return "%s/%s.%s" % (self.__path, "detail", self.__extension)

    def full(self):
        return "%s.%s" % (self.__path, self.__extension)

    def pixels(ratio, size):
        return {
            (
                ImageAspectRatio.LANDSCAPE["landscape"],
                ImageSize.SMALL["small"]
            ): (120, 90),
            (
                ImageAspectRatio.LANDSCAPE["landscape"],
                ImageSize.MEDIUM["medium"]
            ): (175, 130),
            (
                ImageAspectRatio.LANDSCAPE["landscape"],
                ImageSize.LARGE["large"]
            ): (190, 140),
            (
                ImageAspectRatio.LANDSCAPE["landscape"],
                ImageSize.XLARGE["xlarge"]
            ): (270, 200),
            (
                ImageAspectRatio.LANDSCAPE["landscape"],
                ImageSize.AMAZING["amazing"]
            ): (250, 156),
            (
                ImageAspectRatio.LANDSCAPE["landscape"],
                ImageSize.INCREDIBLE["incredible"]
            ): (464, 261),
            (
                ImageAspectRatio.PORTRAIT["portrait"],
                ImageSize.SMALL["small"]
            ): (50, 75),
            (
                ImageAspectRatio.PORTRAIT["portrait"],
                ImageSize.MEDIUM["medium"]
            ): (100, 150),
            (
                ImageAspectRatio.PORTRAIT["portrait"],
                ImageSize.XLARGE["xlarge"]
            ): (150, 225),
            (
                ImageAspectRatio.PORTRAIT["portrait"],
                ImageSize.FANTASTIC["fantastic"]
            ): (168, 252),
            (
                ImageAspectRatio.PORTRAIT["portrait"],
                ImageSize.INCREDIBLE["incredible"]
            ): (216, 324),
            (
                ImageAspectRatio.PORTRAIT["portrait"],
                ImageSize.UNCANNY["uncanny"]
            ): (300, 450),
            (
                ImageAspectRatio.STANDARD["standard"],
                ImageSize.SMALL["small"]
            ): (65, 45),
            (
                ImageAspectRatio.STANDARD["standard"],
                ImageSize.MEDIUM["medium"]
            ): (100, 100),
            (
                ImageAspectRatio.STANDARD["standard"],
                ImageSize.LARGE["large"]
            ): (140, 140),
            (
                ImageAspectRatio.STANDARD["standard"],
                ImageSize.XLARGE["xlarge"]
            ): (200, 200),
            (
                ImageAspectRatio.STANDARD["standard"],
                ImageSize.AMAZING["amazing"]
            ): (180, 180),
            (
                ImageAspectRatio.STANDARD["standard"],
                ImageSize.FANTASTIC["fantastic"]
            ): (250, 250)
        }[(list(ratio.values())[0], list(size.values())[0])]

    def ratios(size):
        return {
            ImageSize.SMALL["small"]: [
                ImageAspectRatio.LANDSCAPE,
                ImageAspectRatio.PORTRAIT,
                ImageAspectRatio.STANDARD
            ],
            ImageSize.MEDIUM["medium"]: [
                ImageAspectRatio.LANDSCAPE,
                ImageAspectRatio.PORTRAIT,
                ImageAspectRatio.STANDARD
            ],
            ImageSize.LARGE["large"]: [
                ImageAspectRatio.LANDSCAPE,
                ImageAspectRatio.STANDARD
            ],
            ImageSize.XLARGE["xlarge"]: [
                ImageAspectRatio.LANDSCAPE,
                ImageAspectRatio.PORTRAIT,
                ImageAspectRatio.STANDARD
            ],
            ImageSize.AMAZING["amazing"]: [
                ImageAspectRatio.LANDSCAPE,
                ImageAspectRatio.STANDARD
            ],
            ImageSize.FANTASTIC["fantastic"]: [
                ImageAspectRatio.PORTRAIT,
                ImageAspectRatio.STANDARD
                ],
            ImageSize.INCREDIBLE["incredible"]: [
                ImageAspectRatio.LANDSCAPE,
                ImageAspectRatio.PORTRAIT
            ],
            ImageSize.UNCANNY["uncanny"]: [
                ImageAspectRatio.PORTRAIT
            ]
        }[list(size.values())[0]]

    def sizes(ratio):
        return {
            ImageAspectRatio.PORTRAIT["portrait"]: [
                ImageSize.SMALL,
                ImageSize.MEDIUM,
                ImageSize.XLARGE,
                ImageSize.FANTASTIC,
                ImageSize.INCREDIBLE,
                ImageSize.UNCANNY
            ],
            ImageAspectRatio.STANDARD["standard"]: [
                ImageSize.SMALL,
                ImageSize.MEDIUM,
                ImageSize.LARGE,
                ImageSize.XLARGE,
                ImageSize.AMAZING,
                ImageSize.FANTASTIC
            ],
            ImageAspectRatio.LANDSCAPE["landscape"]: [
                ImageSize.SMALL,
                ImageSize.MEDIUM,
                ImageSize.LARGE,
                ImageSize.XLARGE,
                ImageSize.AMAZING,
                ImageSize.INCREDIBLE
            ],
        }[list(ratio.values())[0]]

    def thumbnail(self, ratio, size):
        return "%s/%s_%s.%s" % (
            self.__path,
            list(ratio.keys())[0],
            list(size.keys())[0],
            self.__extension
        )
